iT邦幫忙

2023 iThome 鐵人賽

DAY 5
1
自我挑戰組

重新學 Go 30 天系列 第 5

[GO30] Day5 GO 指標

  • 分享至 

  • xImage
  •  

基本概念

先來看一個簡單的範例:

var a int = 10

b := a
b = 20

fmt.Println(a) // 10
fmt.Println(b) // 20

在這個範例中,我們首先宣告並初始化一個變數 a,其值為 10。接著初始化另一個變數 b,並將 a 的值賦給 b。然後將 b 的值更改為 20。最後印出 ab 的值,分別為 10 和 20。

那如果我們將 a指標賦給 b,然後將 b 的值更改為 20 ,會得到怎樣的結果?

var a int = 10

b := &a 
*b = 20 // 要使用 * 才能改到指摽的值

fmt.Println(a)  // 20
fmt.Println(*b) // 20

在這個範例中,我們將 a 的指標賦值給 b,然後使用 *b 的方式來更改 a 的值。因為 b 存儲的是 a 的記憶體地址,所以當我們通過 *b 修改該地址上的值時,a 的值也會被修改。最後印出 a*b 的值,結果均為 20。

常用操作

struct

type Person struct {
		Name string
		Age  int
	}

	person := &Person{
		Name: "John",
		Age:  30,
	}

	person.Name = "Doe"
	person.Age = 40

	fmt.Println(person.Name) // Doe
	fmt.Println(person.Age) // 40

slice

type Person struct {
	Name string
	Age  int
}

people := make([]*Person, 0)

person := &Person{
	Name: "John",
	Age:  30,
}

people = append(people, person)

fmt.Println(people[0]) // &{John 30}

map

type Person struct {
	Name string
	Age  int
}

peopleMap := make(map[string]*Person)
peopleMap["person_a"] = &Person{
	Name: "John",
	Age:  30,
}
peopleMap["person_b"] = &Person{
	Name: "Jane",
	Age:  20,
}

fmt.Println(peopleMap) // map[1:0xc00012a000 2:0xc00012a018]

以上為 struct、slice 和 map 與指標搭配時,最常使用的開發情境。

何時該用指標

先來看 ChatGPT 的答案

在以下情況下,你應該考慮使用指標:

  • 當你想要在函數中修改一個變數的值,而不是只在該函數內部使用該值。
  • 當你想要避免複製大型數據結構時,使用指標可以節省內存和提高性能。
  • 當你需要在不同的函數之間共享數據時,指標可以使它們在內存中指向同一個數據。

以我目前的實務經驗,大部分的情況都是使用指標,這要注意的是使用指標可能會影響到原始資料,所以操作時要格外注意。不使用指標其實也是可以的,但缺點就如上述所說可能會造成記憶體浪費。

沒有一定的答案,以依照開發需求或團隊風格為主。


上一篇
[GO30] Day4 GO 型別
下一篇
[GO30] Day6 function
系列文
重新學 Go 30 天10
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言